#include <iostream>
#include <queue>
#include <stdbool.h>
using namespace std;

namespace YX
{

template<typename W>
struct BinaryTreeNode 
{
    typedef struct BinaryTreeNode<W> Node;
    Node* _prev;
    Node* _next;
    W _w;


    BinaryTreeNode(const W& w)
        :_w(w)
    {

    }

    bool operator<(const Node& n) const 
    {
        return _w<n._w;
    }
   
    bool operator>(const Node& n) const
    {
        return _w>n._w;
    }

};


template<class T>
struct less
{
    bool operator()(const T& x,const T& y)
    {
        return x<y;
    }
};
// 类模板特化
// 全特化
//template<>
//struct less<BinaryTreeNode<int>*> 
//{
//    typedef BinaryTreeNode<int> Node;
//    bool operator()(const Node* x,const Node* y)
//    {
//        return (*x)<(*y);
//    }
//};
// 偏特化
template<class T>
struct less<T*>
{
    bool operator()(const T* x,const T* y) const
    {
        return *x<*y;
    }
};

//// 函数模板
//template<class T>
//bool Greater(const T& x,const T& y)
//{
//    return x>y;
//}
//// 全特化
//template<>
//bool Greater<BinaryTreeNode<int>*>(BinaryTreeNode<int>* x,BinaryTreeNode<int>* y)
//{
//    return *x>*y;
//}
//
//// 偏特化
//template<class T>
//bool Greater<T*>(const T* x,const T* y)
//{
//   return *x>*y; 
//}
//
//
//template <class T>
//struct greater 
//{
//    bool operator()(const T& x,const T& y)
//    {
//        return YX::Greater(x,y);
//    }
//};
// 非类型的模板
template<class T,size_t N=10>
class array 
{
private:
    T* _ptr;
public:
    array()
        :_ptr(new T[N])
    {

    }
};


};

int main(int argc,char* argv[],char* env[])
{


    YX::array<int,30> a;

    //priority_queue<YX::BinaryTreeNode<int>*,vector<YX::BinaryTreeNode<int>*>,YX::less<YX::BinaryTreeNode<int>*>> maxHeap;
    //priority_queue<YX::BinaryTreeNode<int>*,vector<YX::BinaryTreeNode<int>*>,YX::greater<YX::BinaryTreeNode<int>*>> maxHeap;

    //for(int i=0;i<5;i++)
    //{
    //    maxHeap.push(new YX::BinaryTreeNode<int>(i));
    //}

    //while(!maxHeap.empty())
    //{   
    //    YX::BinaryTreeNode<int>* top=maxHeap.top();
    //    cout<<top->_w<<endl;
    //    maxHeap.pop();
    //}

    return 0;
}
